package com.zjj.learn.javaplus.pkg07.demo701;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class IntAddressTest1 {

    public static void main(String[] args) throws UnknownHostException {
        //获取本机主机 IP 地址对象；主机名/IP地址
        InetAddress localHost = InetAddress.getLocalHost();
        //localHost = DESKTOP-CEUDRDQ/192.168.199.1
        System.out.println("localHost = " + localHost);
        //获取 IP 地址
        String address = localHost.getHostAddress();
        System.out.println("address = " + address);


        //获取主机名
        String hostName = localHost.getHostName();
        System.out.println("hostName = " + hostName);

    }


    /**
     * 网路编程的三要素：协议、IP地址、端口号
     * 协议：
     *     如 TCP【传输控制协议】，UDP【用户数据协议】 协议
     *     TCP，是面向连接的，UDP是非面向连接的【面向连接的理解：在传输数据之前，要保证两边可以成功通信】
     *     在TCP 协议中，为了 客户端和服务端之间可靠通信，在传输数据之前，会通过三次握手方式保证连接可靠。
     *     三次握手：
     *         第一次：客户端项服务端发送连接请求，等待服务端确认。【客户端问服务端是不是或者】
     *         第二次：服务端项客户端发送确认请求，通知客户端服务端没问题。【服务端告诉客户端，我活着呢】
     *         第三次：客户端再次项服务端发送请求，告诉它，嗯嗯，我要发送消息了
     *
     *     UDP：在数据发送之前不会建立连接，收不到就收不到【实例语音、视频聊天就是这种连接】
     *          UDP是无连接通信协议，即在数据传输时，数据的发送端和接收端不建立逻辑连接。
     *          简单来说，当一台计算机向另外一台计算机发送数据时，发送端不会确认接收端是否存在，就会发出数据，同样接收端在收到数据时，也不会向发送端反馈是否收到数据。
     *      UDP协议的特点
     *       * 面向无连接的协议
     *       * 发送端只管发送，不确认对方是否能收到。
     *       * 基于数据包进行数据传输。
     *       * 发送数据的大小限制64K以内
     *       * 因为面向无连接，速度快，但是不可靠。
     *
     *       UDP协议相关的两个类
     *         * DatagramPacket
     *            * 数据包对象
     *            * 作用：用来封装要发送或要接收的数据，比如：集装箱
     *         * DatagramSocket
     *            * 发送对象
     *            * 作用：用来发送或接收数据包，比如：码头
     *
     *        DatagramPacket类构造方法
     *         * DatagramPacket(byte[] buf, int length, InetAddress address, int port)
     *            * 创建发送端数据包对象
     *            * buf：要发送的内容，字节数组
     *            * length：要发送内容的长度，单位是字节
     *            * address：接收端的IP地址对象
     *            * port：接收端的端口号
     *        * DatagramPacket(byte[] buf, int length)
     *            * 创建接收端的数据包对象
     *            * buf：用来存储接收到内容
     *            * length：能够接收内容的长度
     *
     *       使用 UDP 发送和 接收数据详情请见：
     *
     * IP地址：IPV4 和 IPV6
     * 端口号：0-65535
     **/

    /**
     * 使用 TCP 协议实现通信，客户端执行步骤
     *    1、客户端创建 Socket 对象，指定服务端的IP和端口；
     *    2、调用 Socket 的 getOutputStream 获取字节输出流对象；
     *    3、调用字节输出流对象的 write 方法向服务端输出数据；
     *    4、调用 Socket 对象的 getInputStream 获取字节输入流对象；
     *    5、调用字节输入流对象的 read 方法获取服务端返回的数据；
     *    关闭 Socket 关闭连接
     *
     **/

    /**
     * 使用 TCP 协议通信，服务端执行步骤
     *    1、创建 ServerSocket 对象，指定端口并开启【相当于启动了一个服务】
     *    2、调用 ServerSocket 对象的 accept 方法，等待客户端连接并且获取对应的 Socket 对象
     *    3、调用 Socket 对象的 getInputStream 获取字节输入流对象
     *    4、调用字节输入流对象的 read 方法获取客户端发送的数据
     *    5、使用 Socket 对象的 getOutputStream 获取字节输出流对象
     *    6、使用字节输出流对象的 write 方法向客户端返回信息
     **/
}
